
package modelo.edificios;

import java.util.ArrayList;

import modelo.catastrofe.Godzilla;
import modelo.centrales.CentralElectrica;
import modelo.excepciones.NoPertenezcoANingunaRedElectricaException;
import modelo.interfaces.ConstruibleTerrestre;
import modelo.interfaces.ConsumidorDeAgua;
import modelo.interfaces.Persistible;
import modelo.mapa.Ubicacion;
import modelo.servicios.PozoDeAgua;
import modelo.servicios.RedElectrica;

public abstract class Edificio implements ConstruibleTerrestre,ConsumidorDeAgua,Persistible {

    protected int vida;
    protected int consumo;
    protected int capacidadAlojamiento;
    protected int capacidadAlojamientoActual;
    protected CentralElectrica centralQueMeAbastece;
    protected PozoDeAgua pozoQueAbastece;
    protected Ubicacion ubicacion;
    
    public Edificio()
    {
        this.vida = 100;
        this.centralQueMeAbastece = null;
        this.pozoQueAbastece = null;
    }
    
    public int obtenerVida()
    {
            return this.vida;
    }       

    public int obtenerConsumo()
    {
            return this.consumo;
    }       
    
    public void vida(int vidaAAsignar)
    {
            this.vida = vidaAAsignar;
    }
    
    public abstract void repararse();
    
    public boolean tieneLuz()
    {
            if(this.centralQueMeAbastece != null)
            {
                    return this.centralQueMeAbastece.abastezcoAlEdificio(this);
            }
            return false;
    }
    
    public int alojarPersonasEnEdificio(int cantidadDeCiudadanosAAlojar)
    {
            int cantidadDeCiudadanosQueSePudieronAlojar = 0;
            
            if(this.tieneServicios())
            {
                    if(this.obtenerCapacidadAlojamientoActual() >= cantidadDeCiudadanosAAlojar) 
                    {
                            this.restarCapacidadDeTrabajo(cantidadDeCiudadanosAAlojar);
                            cantidadDeCiudadanosQueSePudieronAlojar = cantidadDeCiudadanosAAlojar;
                    }
                    else
                    {
                            cantidadDeCiudadanosQueSePudieronAlojar = this.obtenerCapacidadAlojamientoActual();
                            this.restarCapacidadDeTrabajo(this.obtenerCapacidadAlojamientoActual());
                    }
            }
            return cantidadDeCiudadanosQueSePudieronAlojar;
    }
    
    public boolean tieneServicios()
    {
            if((this.tieneAgua()) && (this.tieneLuz()))
            {
                    return true;
            }       
            return false;
    }
    
    private void restarCapacidadDeTrabajo(int cantidadDeCiudadanosARestar) 
    {
            this.capacidadAlojamientoActual -= cantidadDeCiudadanosARestar;
    }

    public int obtenerCapacidadAlojamientoActual()
    {
            return this.capacidadAlojamientoActual;
    }
    
    public int obtenerCantidadDePersonasQueSeAlojanEnEdificio()
    {
            return (this.capacidadAlojamiento - this.capacidadAlojamientoActual);
    }
    
    public int obtenerCapacidadAlojamiento()
    {
            return this.capacidadAlojamiento;
    }


    public void centralQueAbastece(CentralElectrica central)
    {
            this.centralQueMeAbastece = central;
    }
    
    public CentralElectrica obtenerCentralQueAbastece() 
    {               
        return this.centralQueMeAbastece;
    }
    
    public void recibirDanio(double danioDelTerremoto) 
    {
        this.vida=(int) (this.vida-danioDelTerremoto);
        this.verificarVida();
        this.actualizarCantidadDePersonas();
    }

    public abstract void recibirDanio(Godzilla godzilla);
            
    public RedElectrica obtenerRedElectricaALaQuePertenezco() 
    {
            throw new NoPertenezcoANingunaRedElectricaException();  
    }
    
    @Override
    public void verificarVida() 
    {
            if(this.vida < 0)
            {
                    this.vida = 0;
            }               
    }       
    
    private void actualizarCantidadDePersonas()
    {
            if (this.obtenerCantidadDePersonasQueSeAlojanEnEdificio() > this.vida ) 
            {
                    this.capacidadAlojamientoActual = (this.capacidadAlojamiento - this.vida);
            }
    }
    
    public boolean consumeAgua() 
    {
            return true;
    }
    
    
    public PozoDeAgua obtenerPozoQueAbastece()
    {
            return this.pozoQueAbastece;
    }

    
    public void asignarPozoDeAgua(PozoDeAgua pozoDeAgua) 
    {
            this.pozoQueAbastece = pozoDeAgua;
    }

    public boolean tieneAgua()
    {
            if (this.pozoQueAbastece != null)
            {
                    return (this.pozoQueAbastece.abastezcoAConstruccion(this));
            }
            return false;
    }
    
    
    public boolean esTransitable()
    {
            return false;
    }
    
    
    public Ubicacion obtenerUbicacion() 
    {
        return this.ubicacion;
    }
    
    public void asignarUbicacion(Ubicacion unaUbicacion)
    {
        this.ubicacion = unaUbicacion;
    }
    
    
    public boolean esReparable() 
    {
        return true;
    }
    
	@Override
	public void cortarSuministroDeEnergia(CentralElectrica centralElectrica)
	{
		if (this.centralQueMeAbastece == centralElectrica)
		{
			this.centralQueMeAbastece = null;
		}
	}
	
	@Override
	public void comenzarSuministroDeEnergia(CentralElectrica centralElectrica) 
	{
		if (this.centralQueMeAbastece == null)
		{
			this.centralQueMeAbastece = centralElectrica;
		}
	}
	
	@Override
	public ArrayList<Object> obtenerDatosPersistibles() {
		ArrayList<Object> elems=new ArrayList<Object>();
		elems.add(vida);
		elems.add(consumo);
		elems.add(capacidadAlojamientoActual);
		elems.add(ubicacion);
		return elems;
	}

	@Override
	public void poblar(ArrayList elementos) {
		this.vida=(int)elementos.get(0);
		this.consumo=(int)elementos.get(1);
		this.capacidadAlojamientoActual=(int)elementos.get(2);
		this.ubicacion=(Ubicacion)elementos.get(3);
	}
}